#include "spi_soft_drv.h"
#include <stdio.h>
/**
 * @desc  : 初始化
 * @date  : 2024-12-04
 * @author: AnRui
 */
void SpiSoftInit(void) {
    /******************* GPIO **********************/
    // SCL 推挽输出
    rcu_periph_clock_enable(SPI_SOFT_CLK_RCU);
    gpio_init(SPI_SOFT_CLK_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, SPI_SOFT_CLK_PIN);

    // MOSI 推挽输出
    rcu_periph_clock_enable(SPI_SOFT_MOSI_RCU);
    gpio_init(SPI_SOFT_MOSI_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, SPI_SOFT_MOSI_PIN);

    // MISO	上拉输入
    rcu_periph_clock_enable(SPI_SOFT_MISO_RCU);
    gpio_init(SPI_SOFT_MISO_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, SPI_SOFT_MISO_PIN);

    // sclk空闲态
    SPI_SCLK_IDEL_STATE();
}

/**
 *  @desc  :软实现方式 发送读取spi数据
 * @date  : 2025-02-28
 * @author: AnRui
 * @param :  data - {参数说明}:
 * @return: uint8_t
 * @note  : 正常是 scl上升沿的时候 读取数据 因为是手动 所有没办法
 *          所以在统一在scl高电平的时候读和写 不影响
 *          在拉高之前就准备好数据
 */
uint8_t SpiSoftReadWriteByte(uint8_t data) {
    uint8_t i;
    uint8_t read = 0;
    for (i = 0; i < 8; i++) {
        // 写数据
        if (data & 0x80)
            SPI_SOFT_MOSI(1);
        else
            SPI_SOFT_MOSI(0);
        data <<= 1;
        SPI_SCLK_ACTIVE_STATE();
        // 读数据
        read <<= 1;
        read |= SPI_SOFT_MISO_STATE();
        SPI_SCLK_IDEL_STATE();
    }
    return read;
}


